target = out
BuildDir = obj
ObjDir= bin

SrcFiles = $(wildcard *.cpp)
SrcFiles += $(wildcard ./src/*.cpp)
SrcFiles += $(wildcard ./src/Algorithm/*.cpp)

CC = g++

# 源文件目录
ObjFiles = $(addprefix $(BuildDir)/$(ObjDir)/,$(notdir $(SrcFiles:.cpp=.o)))
vpath %.cpp $(sort $(dir $(SrcFiles)))

# 头文件所在文件目录
IncFiles += $(addprefix -I,./inc)
IncFiles += $(addprefix -I,./inc/Algorithm)
#此处加入调试功能，当使用make Debug=1指令编译时，将带有
#调试信息，在launch.json中需要使用
CFLAG = $(IncFiles)
ifeq ($(Debug),1)
	CFLAG += -g -gdwarf-2
else
	CFLAG += -O2 -Os -g0
endif
# CFLAG += -g -gdwarf-2
#定义最终可执行的文件
all:$(BuildDir)/$(target)

#.o文件依赖于.c文件，通配使用，一条就够
$(BuildDir)/$(ObjDir)/%.o:%.cpp Makefile | $(BuildDir)/$(ObjDir)
	@$(CC)  -c $(CFLAG)  $< -o $@
	@echo compilling $(notdir $(<:.cpp=.o)) ...

#编译目标文件
$(BuildDir)/$(target):$(ObjFiles) Makefile  | $(BuildDir)/$(ObjDir)
	@$(CC) -o $@ $(CFLAG) $(SrcFiles) -o $@
	@echo excutable file $(BuildDir)/$(target) ...

# 创建目标文件夹
$(BuildDir):
	@mkdir $@

$(BuildDir)/$(ObjDir):
#	@	@-mkdir $@
	$(shell if [ ! -e $(@) ];then mkdir -p $(@); fi)

#清除编译所产生的所有文件
.PHONY:clean
clean:
	rm -fR $(BuildDir)
	-rm -fR $(BuildDir)/$(ObjDir)/**

print:
	@echo $(ObjFiles)